20180412 Wikipedia 爬蟲練習
###導入模組
from bs4 import BeautifulSoup
from urllib.request import urlopen
import re
import random
###給定初始的wiki連結(base_url),以及一個有初始關鍵字連結的list(his)
base_url = "https://zh.wikipedia.org"
his = ["/wiki/%E5%8F%B0%E7%81%A3%E7%A9%8D%E9%AB%94%E9%9B%BB%E8%B7%AF%E8%A3%BD%E9%80%A0"]
###初始關鍵的wiki包進BS裡面
url = base_url + his[-1] #his[-1]為list中的最後(新)一項
html = urlopen(url).read().decode('utf-8')
soup = BeautifulSoup(html, features='lxml')
###打印出title以及其對應的連結
print(soup.find('h1',{'id':'firstHeading'}).get_text(), ' url: ', base_url+str(his[-1]))
[同場加映] 從初始關鍵字裡面的連結開始循環式的爬蟲 (例子為50次)
###做50次循環,同前例方式抓出title及對應連結
for i in range(50):
url = base_url + his[-1]
html = urlopen(url).read().decode('utf-8')
soup = BeautifulSoup(html, features='lxml')
print(soup.find('h1',{'id':'firstHeading'}).get_text(), ' url: ', base_url+str(his[-1]))
### 用BS模組找到有效的連結
### 正則表達的解釋
# (?=^/wiki) -> 表示開頭必須符合/Wiki
# (%.{2}) -> ()表示將其括弧內的內容組合在一起看; %.{2}表示%+任何符號重複兩次
# +$ -> +表示匹配前面括號內字符無限次; $表示匹配字串的末尾
sub_urls = soup.find_all("a", { "href": re.compile("(?=^/wiki)/wiki/(%.{2})+$")})
### 如頁面裡無連結或重複,則跳回前一(最新)連結
### 找到的所有連結將其隨機取得sub_url的第一項
if sub_urls== his[-1]:
his.pop(-1)
elif len(sub_urls) != 0:
his.append(random.sample(sub_urls, 1)[0]['href'])
else:
his.pop(-1)